home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / apps / 186 / applic / prntrcfg.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-10-13  |  42.9 KB  |  1,237 lines

  1. PROGRAM Epson;
  2. CONST
  3.   {$I GEMCONST.PAS}
  4. TYPE
  5.   {$I GEMTYPE.PAS}
  6.  
  7. {$I GEMSUBS.PAS}
  8. {$I CURSOR.PAS}
  9.   PROCEDURE Do_Main;
  10.     CONST
  11.       KCmdFileName = 'A:\PRTSTUPA.INF';
  12.       Bel = 7;     {ASCII}
  13.       ESC = 27;   {ASCII}
  14.       W = 63;
  15.       H = 21;
  16.       NoBorder = 0;
  17.       Blk = 384;
  18.     VAR
  19.       OutFile : text;
  20.       CmdFileName : string;
  21.       S : ARRAY[1..70] OF string[20];
  22.       Title : string;
  23.       ButtonArr : ARRAY [1..70] OF integer;
  24.       ButtonSelected : ARRAY [1..70] OF boolean;
  25.       ButtonIx : integer;
  26.       EditNumber : ARRAY [50..55] OF integer;
  27.       junk : integer;
  28.       Box : dialog_ptr;      {main menu}
  29.       ExoticaBox : dialog_ptr;
  30.       ExoticButtonArr : ARRAY [1..20] OF integer;
  31.       ExoticaDrawn : boolean;
  32.       Pushed, i : integer;
  33.       x, y : integer;
  34.       j, MyNumber : integer;
  35.       CC : PACKED ARRAY[1..511] OF char;
  36.       ExoticaCC : PACKED ARRAY [1..30] OF char;
  37.       NbrCharOfExotica : integer;
  38.       NbrCharInCC : integer;
  39.       NationCode : integer;
  40.       DebugSet : SET OF 1..20;
  41.  
  42.     PROCEDURE Abort
  43.         (ReasonCode : integer);
  44.       BEGIN
  45.         WriteLn('Abort.  Reason code:',ReasonCode);
  46.         ReadLn;
  47.         HALT;
  48.       END {abort};
  49.  
  50.       FUNCTION OutPtr
  51.                 (ch : char)
  52.                     : long_integer;
  53.         GEMDOS ($05);
  54.  
  55.     PROCEDURE StringToInteger
  56.                        (VAR Str  : string;
  57.                      VAR Result  : integer;
  58.                          NbrChar : integer);
  59.       {If string is not right justified, return a value of zero.
  60.       It ends up being a mind reading job to try to determine what the
  61.       user wanted in the other cases.}
  62.       VAR
  63.         Class : integer;
  64.         Item, i : integer;
  65.         BCD   : ARRAY [1..3] OF integer;
  66.  
  67.         FUNCTION Digit
  68.                 (Str : string)
  69.                      : boolean;
  70.           {Test to see if Str[i] is a BCD digit.}
  71.           VAR Nbr : integer;
  72.           BEGIN
  73.             Nbr := ORD(Str[1]) - ORD('0');
  74.             IF (Nbr >= 0) AND (Nbr <= 9)
  75.               THEN Digit := TRUE
  76.               ELSE Digit := FALSE;
  77.           END {digit};
  78.  
  79.       BEGIN {stringtointeger}
  80.         IF NbrChar = 2 THEN
  81.           Insert('*',Str,1); {Class can only be 0 - 3}
  82.         {Classify the pattern as to digit, non- digit. 1 in following
  83.         code represents a digit};
  84.         Class := 0;
  85.         FOR i := 1 TO 3 DO
  86.           IF Digit(Str[i]) THEN
  87.             BEGIN
  88.               CASE i OF
  89.                 1 : Class := Class + 4;
  90.                 2 : Class := Class + 2;
  91.                 3 : CLass := Class + 1;
  92.               END {case};
  93.               BCD[i] := ORD(Str[i]) - ORD('0');
  94.             END;
  95.         (*writeln('class:',class,'str:',str[1],str[2],str[3]);*)
  96.         CASE Class OF
  97.           1 : Result := BCD[3];
  98.           3 : Result := BCD[2] * 10 + BCD[3];
  99.           7 : Result := BCD[1] * 100 + BCD[2] * 10 + BCD[3];
  100.           0,2,4,5,6 : Result := 0;
  101.         END {case};
  102.       END {stringtointeger};
  103.  
  104.     PROCEDURE PrintCommandCodes;
  105.       VAR i : integer;
  106.       BEGIN
  107.         FOR i := 1 TO NbrCharInCC DO
  108.           BEGIN
  109.             IF (CC[i] = CHR(ESC)) OR (CC[i] = CHR(BEL)) THEN
  110.               WriteLn;
  111.             IF CC[i] > ' '
  112.               THEN Write(i,':',CC[i])
  113.               ELSE Write(i,':',ORD(CC[i]));
  114.             Write(' ');
  115.           END;
  116.         WriteLn;
  117.       END {printcommandcodes};
  118.  
  119.     PROCEDURE FormPrinterCommands;
  120.       VAR
  121.         i, j : integer;
  122.         MSCode : integer;
  123.  
  124.       PROCEDURE ComputeMasterSelectCode
  125.                                (VAR N : integer);
  126.         BEGIN
  127.           N := 0;
  128.           IF ButtonSelected[2 ] THEN N := N +   4   ;
  129.           IF ButtonSelected[3 ] THEN N := N +   1   ;
  130.           {Pica = 0, do nothing.}
  131.           IF ButtonSelected[5 ] THEN N := N +  32   ;
  132.           IF ButtonSelected[7 ] THEN N := N +  16   ;
  133.           IF ButtonSelected[8 ] THEN N := N +   8   ;
  134.           IF ButtonSelected[12] THEN N := N +  64   ;
  135.           IF ButtonSelected[13] THEN N := N + 128   ;
  136.         END {computemasterselectcode};
  137.  
  138.       PROCEDURE ProcessPerforations;
  139.         BEGIN
  140.           CC[i] := CHR(ESC);
  141.           CC[i + 1] := 'C';
  142.           IF ButtonSelected[37] {inches}
  143.              THEN
  144.                BEGIN
  145.                  IF EditNumber[50] > 22 THEN
  146.                    EditNumber[50] := 22;
  147.                  IF EditNumber[50] < 1 THEN
  148.                    EditNumber[50] := 1;
  149.                  CC[i + 2] := CHR(0);
  150.                  CC[i + 3] := CHR(EditNumber[50]);
  151.                  i := i + 4;
  152.                END
  153.              ELSE
  154.                BEGIN      {Lines}
  155.                  IF EditNumber[51] < 1 THEN
  156.                    EditNumber[51] := 1;
  157.                  IF EditNumber[51] > 127 THEN
  158.                    EditNumber[51] := 127;
  159.                  CC[i + 2] := CHR(EditNumber[51]);
  160.                  i := i + 3;
  161.                END;
  162.  
  163.           {skip perforations}
  164.           IF ButtonSelected[29]
  165.             THEN
  166.               BEGIN
  167.                 CC[i] := CHR(ESC);  {Number of lines to skip}
  168.                 CC[i + 1] := 'N';
  169.                 CC[i + 2] := CHR(EditNumber[52]);
  170.                 i := i + 3;
  171.               END
  172.           ELSE            {Atari mode.  Write on the damn perforations!}
  173.             BEGIN
  174.               CC[i] := CHR(ESC);
  175.               CC[i + 1] := 'O';
  176.               i := i + 2;
  177.             END;
  178.         END {processperorations};
  179.  
  180.       BEGIN      {formprintercommands}
  181.         {Generate the command codes
  182.         in a character array called CC.  The index on CC is i.
  183.         Each procedure reads and writes CC and i as it wishes.
  184.         At the call, i identifies the next character to enter.}
  185.         FOR i := 1 TO 511 DO
  186.           CC[i] := CHR(0);      {ASCII null }
  187.         i := 1;
  188.         {reset}
  189.         CC[i] := CHR(ESC);
  190.         CC[i + 1] := '@';
  191.         i := i + 2;
  192.  
  193.         {master select}
  194.         CC[i] := CHR(ESC);
  195.         CC[i + 1] := '!';
  196.         ComputeMasterSelectCode(MSCode);
  197.         CC[i + 2] := CHR(MSCode);
  198.         i := i + 3;
  199.  
  200.         {NLQ}
  201.         IF ButtonSelected[10] THEN
  202.           BEGIN
  203.             CC[i] := CHR(ESC);
  204.             CC[i + 1] := 'x';
  205.             CC[i + 2] := '1';
  206.             i := i + 3;
  207.           END;
  208.  
  209.         {script}
  210.         IF ButtonSelected[16] OR ButtonSelected[17] THEN
  211.           BEGIN
  212.             CC[i] := CHR(ESC);
  213.             CC[i + 1] := 'S';
  214.             i := i + 3;
  215.             IF ButtonSelected[16]
  216.               THEN CC[i + 2] := '0'
  217.               ELSE CC[i + 2] := '1';
  218.           END;
  219.  
  220.         ProcessPerforations;
  221.  
  222.         {line spacing}
  223.         IF ButtonSelected[19] THEN
  224.           BEGIN
  225.             CC[i] := CHR(ESC);
  226.             CC[i + 1] := '1';
  227.             i := i + 2;
  228.           END;
  229.         IF ButtonSelected[20] THEN
  230.           BEGIN
  231.             CC[i] := CHR(ESC);
  232.             CC[i + 1] := '0';
  233.             i := i + 2;
  234.           END;
  235.         IF ButtonSelected[21] THEN
  236.           BEGIN
  237.             CC[i] := CHR(ESC);
  238.             CC[i + 1] := '2';
  239.             i := i + 2;
  240.           END;
  241.         IF ButtonSelected[22] THEN
  242.           BEGIN
  243.             CC[i] := CHR(ESC);
  244.             CC[i + 1] := '3';
  245.             CC[i + 2] := CHR(EditNumber[55]);
  246.             i := i + 3;
  247.           END;
  248.  
  249.         {paper out sensor}
  250.         IF ButtonSelected[23] THEN
  251.           BEGIN
  252.             CC[i] := CHR(ESC);
  253.             CC[i + 1] := '8';
  254.             i := i + 2;
  255.           END;
  256.  
  257.         {Left margin}
  258.         CC[i] := CHR(ESC);
  259.         CC[i + 1] := 'l';
  260.         CC[i + 2] := CHR(EditNumber[54]);
  261.         i := i + 3;
  262.  
  263.         {language choice}
  264.         CC[i]     := CHR(ESC);
  265.         CC[i + 1] := 'R';
  266.         CC[i + 2] := CHR(NationCode);
  267.         i         := i + 3;
  268.  
  269.         {--------------------------------------------------------------}
  270.                               {from the exotica menu}
  271.         FOR j := 1 TO NbrCharOfExotica DO
  272.           BEGIN
  273.             CC[i] := ExoticaCC[j];
  274.             i := i + 1;
  275.           END;
  276.  
  277.         {sound beeper to indicate success}
  278.         CC[i] := CHR(7);    {ASCII Bel}
  279.         i := i + 1;
  280.  
  281.         {done}
  282.         {Next character is a null because of initializing done at begin.}
  283.         NbrCharInCC := i - 1;
  284.         (*Writeln('number char in cc:',nbrcharincc);*)
  285.         (*PrintCommandCodes;*)
  286.       END {formprintercommands};
  287.  
  288.     PROCEDURE SendCommandsToPrinter;
  289.       VAR
  290.         i : integer;
  291.         Status : long_integer;
  292.  
  293.       BEGIN
  294.         FOR i := 1 TO NbrCharInCC DO
  295.           BEGIN
  296.             Status := Outptr(CC[i]);
  297.             IF Status = 0 THEN
  298.               Abort(8191);
  299.           END;
  300.       END {sendcommandstoprinter};
  301.  
  302.     PROCEDURE SndCommandsToFile;
  303.       VAR i : integer;
  304.       BEGIN
  305.         REWRITE(OutFile,CmdFileName);
  306.         FOR i := 1 TO NbrCharInCC DO
  307.           Write(OutFile,CC[i]);
  308.         WriteLn(OutFile);
  309.         Close(OutFile);
  310.       END {sndcommandstofile} ;
  311.  
  312.     PROCEDURE PrintTwoLines;
  313.       CONST
  314.         LF = 10;
  315.         CR = 13;
  316.       VAR
  317.         ch : char;
  318.         i : integer;
  319.  
  320.       PROCEDURE Output(ch : char);
  321.         VAR
  322.           Status : long_integer;
  323.         BEGIN
  324.           Status := OutPtr(ch);
  325.           IF Status = 0 THEN
  326.             Abort(8192);
  327.         END {output}  ;
  328.  
  329.       BEGIN {printtwolines}
  330.         FOR i := 0 TO 25 DO
  331.           OutPut(CHR(i + ORD('a')));
  332.         OutPut(CHR(LF));
  333.         OutPut(CHR(CR));
  334.         FOR i := 0 TO 25 DO
  335.           OutPut(CHR(i + ORD('A')));
  336.         OutPut(CHR(LF));
  337.         OutPut(CHR(CR));
  338.       END {printtwolines};
  339.  
  340.     FUNCTION MakeButton
  341.                   (X : integer;
  342.                    Y : integer;
  343.                  Nchar : integer;
  344.                    S : string;
  345.              ExitBtn : boolean)
  346.                      : integer;
  347.       VAR
  348.         Nbr : integer;
  349.         ButtonType : integer;
  350.       BEGIN
  351.         IF ExitBtn
  352.           THEN ButtonType := Selectable | Exit_Btn
  353.           ELSE ButtonType := Selectable;
  354.  
  355.         Nbr := Add_DItem(Box,G_Button,ButtonType,
  356.                         x,y,Nchar,1,   NoBorder,Blk);
  357.         Set_DText(Box,Nbr,S, System_Font,TE_Left);
  358.         MakeButton := Nbr;
  359.       END {makebutton};
  360.  
  361.     FUNCTION GetEditableLine
  362.                  (x : integer;
  363.                   y : integer;
  364.               Nchar : integer;
  365.              Sample : string)
  366.                     : integer;
  367.       VAR
  368.         Nbr : integer;
  369.       BEGIN
  370.         Nbr := Add_DItem(Box, G_FText,Editable,
  371.                              x,y,Nchar,1,    NoBorder,Blk);
  372.         Set_DEdit(Box,Nbr,
  373.                 '__',  '99',  Sample,
  374.                 System_Font, TE_Left);
  375.         GetEditableLine := Nbr;
  376.       END {geteditableline};
  377.  
  378.     PROCEDURE MakeText
  379.                 (X : integer;
  380.                  Y : integer;
  381.                 Nchar : integer;
  382.                 S : string);
  383.       BEGIN
  384.         Junk := Add_DItem(Box,G_String,None,
  385.                        X,Y,NChar,1,    NoBorder,Blk);
  386.         Set_DText(Box,junk,S,System_Font,TE_Left);
  387.       END {maketext};
  388.  
  389.     PROCEDURE InitializeButtons;
  390.       VAR
  391.         ButtonsSet : SET OF 1..70;
  392.         i : 1..70;
  393.       BEGIN
  394.         FOR i := 1 TO 70 DO
  395.           ButtonSelected[i] := FALSE;
  396.         ButtonsSet := [4,15,21,24,37];
  397.         FOR i := 1 TO 49 DO
  398.           WHILE i IN ButtonsSet DO
  399.             BEGIN
  400.               Obj_SetState(Box,ButtonArr[i], Selected,
  401.                            FALSE {redraw needed ? }     );
  402.               ButtonSelected[i] := TRUE;
  403.               ButtonsSet := ButtonsSet - [i];
  404.             END;
  405.       END {initializebuttons};
  406.  
  407.     PROCEDURE ChangeMutuallyExclusive
  408.          (This,First,Last : integer;
  409.                       Box : dialog_ptr);
  410.       VAR
  411.         i : integer;
  412.       BEGIN
  413.         FOR i := First To Last DO
  414.           BEGIN
  415.             Obj_SetState(Box,ButtonArr[i],Normal,TRUE);
  416.           END;
  417.         Obj_SetState(Box,ButtonArr[This],Selected,TRUE);
  418.         (*FOR i := first to last do
  419.           writeln(i,':',buttonselected[i]);*)
  420.       END {changemutuallyexclusive};
  421.  
  422.     PROCEDURE ConvertGEMNbrtoMyNbr
  423.                  (GEMNbr : integer; {the number returned by
  424.                                     calls to Add_DItem}
  425.               VAR MyNbr : integer); {The number used to store text strings
  426.                                     and address arrays. MyNbr[2] refers to
  427.                                     'Compressed'}
  428.       VAR
  429.         i : integer;
  430.       BEGIN
  431.         FOR i := 1 TO 50 DO
  432.           IF ButtonArr[i] = GEMNbr THEN
  433.             MyNbr := i;
  434.       END {covertGEMnbrtomynbr};
  435.  
  436.     PROCEDURE FillStringsWithText;
  437.       BEGIN
  438.       Title := 'Penultimate Printer Setter Upper';
  439.       s[1] := 'PITCH';
  440.       S[2] := 'Compressed';
  441.       S[3] := 'Elite';
  442.       S[4] := 'Pica';
  443.       S[5] := 'Expanded';
  444.  
  445.       S[6] := 'BOLDNESS';
  446.       S[7] := 'DoubleStrike';
  447.       S[8] := 'Emphasized';
  448.  
  449.       s[9] := 'QUALITY';
  450.       S[10] := 'NLQ';
  451.  
  452.       s[11] := 'EFFECTS';
  453.       s[12] := 'Italic';
  454.       s[13] := 'Underline';
  455.  
  456.       s[14] := 'SCRIPT';
  457.       s[15] := 'Normal';
  458.       s[16] := 'Super';
  459.       s[17] := 'Sub';
  460.  
  461.       s[18] := 'LINE SPACING';
  462.       s[19] := '7 / 72';
  463.       s[20] := '1 / 8';
  464.       s[21] := '1 / 6';
  465.       s[22] := 'n / 216';
  466.  
  467.       s[38] := 'PAPER OUT SENSOR';
  468.       s[23] := 'OFF';
  469.       s[24] := 'ON';
  470.  
  471.       s[25] := 'FORM LENGTH';
  472.       s[26] := 'inches';
  473.       s[27] := 'char.';
  474.       s[28] := 'skip(char)';
  475.       s[29] := 'Skip perforations';
  476.  
  477.       s[30] := 'LEFT MARGIN';
  478.  
  479.       s[31] := 'DO AND RETURN';
  480.       s[32] := 'Print test line';
  481.       s[33] := 'Form Feed';
  482.  
  483.       s[36] := 'Character set';
  484.  
  485.       s[42] := 'HELP';
  486.       s[34] := 'Cancel';
  487.       s[35] := 'Do it';
  488.       s[39] := 'Save File';
  489.       s[41] := 'Exotica';
  490.  
  491.  
  492.       END {fillstringswithtext};
  493.  
  494.     PROCEDURE FillButtonSelectedArray;
  495.       VAR i, j :integer;
  496.       BEGIN
  497.         FOR j := 1 TO 50 DO
  498.           BEGIN
  499.             i := ButtonArr[j];
  500.             IF Obj_State(box,i) & Selected <> 0
  501.               THEN ButtonSelected[j] := TRUE
  502.               ELSE ButtonSelected[j] := FALSE;
  503.             (*Writeln(j,':',ButtonSelected[j]);*)
  504.            END;
  505.       END {fillbuttonselectedarray};
  506.  
  507.     PROCEDURE DisplayOptions;
  508.       VAR
  509.         i, j : integer;
  510.         BoxRedrawNeeded : boolean;
  511.  
  512.       PROCEDURE ProcessButtonPush;
  513.   
  514.         PROCEDURE MakeText
  515.                   (Box : dialog_ptr;
  516.                      X : integer;
  517.                      Y : integer;
  518.                     Nchar : integer;
  519.                     S : string);
  520.           BEGIN
  521.             Junk := Add_DItem(Box,G_String,None,
  522.                            X,Y,NChar,1,    NoBorder,Blk);
  523.             Set_DText(Box,junk,S,System_Font,TE_Left);
  524.           END {maketext};
  525.     
  526.         FUNCTION MakeButton
  527.                     (Box : dialog_ptr;
  528.                        X : integer;
  529.                        Y : integer;
  530.                      Nchar : integer;
  531.                        S : string;
  532.                  ExitBtn : boolean)
  533.                          : integer;
  534.           VAR
  535.             Nbr : integer;
  536.             ButtonType : integer;
  537.           BEGIN
  538.             IF ExitBtn
  539.               THEN ButtonType := Selectable | Exit_Btn
  540.               ELSE ButtonType := Selectable;
  541.     
  542.             Nbr := Add_DItem(Box,G_Button,ButtonType,
  543.                             x,y,Nchar,1,   NoBorder,Blk);
  544.             Set_DText(Box,Nbr,S, System_Font,TE_Left);
  545.             MakeButton := Nbr;
  546.           END {makebutton};
  547.     
  548.         PROCEDURE ShowInternationalMenu;
  549.   
  550.           PROCEDURE DisplayCharacterSets;
  551.             CONST
  552.               w = 55;
  553.               h = 19;
  554.             VAR
  555.               CharSetBox : dialog_ptr;
  556.               S : ARRAY[1..20] OF string[45];
  557.               IntlButtArr : ARRAY [1..20] OF integer;
  558.               i, x, y : integer;
  559.               CharPushed : integer;
  560.     
  561.             PROCEDURE SelectNewButton
  562.                          (ButtonNbr : integer);
  563.               VAR
  564.                 i : integer;
  565.                 GemNbr : integer;
  566.               BEGIN
  567.                 FOR i := IntlButtArr[1] TO IntlButtArr[11] DO
  568.                   Obj_SetState(CharSetBox,i,Normal,TRUE);
  569.                 FOR i := 1 TO 11 DO
  570.                   IF ButtonNbr = IntlButtArr[i] THEN
  571.                     GemNbr := IntlButtArr[i];
  572.                 Obj_SetState(CharSetBox,ButtonNbr,Selected,TRUE);
  573.               END {selectnewbutton};
  574.     
  575.             PROCEDURE ConvertChoiceToEpsonCode;
  576.               VAR i, Choice : integer;
  577.               BEGIN
  578.               {Convert from button index to Epson code.}
  579.               FOR i := 1 TO 11 DO
  580.                 IF (Obj_State(CharSetBox,IntlButtArr[i]) & Selected) > 0
  581.                   THEN Choice := i;
  582.               CASE Choice OF              {nationcode is global}
  583.                 1  : NationCode := 4;
  584.                 2  : NationCode := 10;
  585.                 3  : NationCode := 1;
  586.                 4  : NAtionCode := 2;
  587.                 5  : NationCode := 6;
  588.                 6  : NationCode := 8;
  589.                 7  : NationCode := 9;
  590.                 8  : NationCode := 7;
  591.                 9  : NationCode := 5;
  592.                 10 : NationCode := 3;
  593.                 11 : NationCode := 0;
  594.               END {case};
  595.     
  596.               END {convertchoicetoEpsoncode};
  597.     
  598.             PROCEDURE PrintLanguageSample;
  599.               BEGIN
  600.                 ConvertChoiceToEpsonCode;
  601.                 FormPrinterCommands;
  602.                 SendCommandsToPrinter;
  603.                 WriteLn(' # $ @ [ \ ] ^ ` { | } ` '  );
  604.                 WriteLn;
  605.                 IF NationCode = 1 {France}
  606.                   THEN WriteLn('           ',
  607.                        'Blaise Pascal - Math{maticien, c{l}bre Fran\ais.' );
  608.                 Obj_SetState(CharSetBox,IntlButtArr[16],Normal,TRUE);
  609.                 Obj_SetState(Box,ButtonArr[34],Disabled,FALSE);
  610.               END {printlanguagesample};
  611.     
  612.             BEGIN    {displaycharactersets}
  613.               FOR i := 1 TO 20 DO
  614.                 IntlButtArr[i] := 0;
  615.               CharSetBox := New_Dialog(20,   0,0,w,h);
  616.               S[ 1] := 'Denmark I';
  617.               S[ 2] := 'Denmark II';
  618.               S[ 3] := 'France';
  619.               S[ 4] := 'Germany';
  620.               S[ 5] := 'Italy';
  621.               S[ 6] := 'Japan';
  622.               S[ 7] := 'Norway';
  623.               S[ 8] := 'Spain';
  624.               S[ 9] := 'Sweden';
  625.               S[10] := 'UK';
  626.               S[11] := 'USA';
  627.               S[12] := 'RETURN';
  628.               S[13] := 'The following ASCII characters are redefined';
  629.               S[14] := '      with choices other than USA:';
  630.               S[15] := '         # $ @ [ | ] ^ ` { | } ~';
  631.               S[16] := 'TEST PRINT';
  632.     
  633.                                 {header}
  634.               x := 5; y := 1;
  635.               MakeText(CharSetBox,x    ,y     ,   45,  s[13]);
  636.               MakeText(CharSetBox,x    ,y + 1 ,   45,  s[14]);
  637.               MakeText(CharSetBox,x    ,y + 2 ,   45,  s[15]);
  638.                                     {left side}
  639.               x := 10; y := 5;
  640.               FOR i := 1 TO 6 DO
  641.               IntlButtArr[i] := MakeButton(CharSetBox,x, y + i , 12,S[i],TRUE);
  642.                                     {right side}
  643.               x := 32; y := 5;
  644.               FOR i := 7 to 11 DO
  645.             IntlButtArr[i] := MakeButton(CharSetBox,x,y + i - 6,12, s[i],TRUE);
  646.                                 {select USA}
  647.               x := 22; y := 14;
  648.               Obj_SetState(CharSetBox,IntlButtArr[11],Selected,FALSE);
  649.                                 {test print}
  650.               IntlButtArr[16] := MakeButton(CharSetBox,x    ,y    , 12, s[16],
  651.                                    TRUE);
  652.                                 {RETURN button}
  653.               IntlButtArr[12] := Add_DItem(CharSetBox,G_Button,
  654.                                    Selectable | Exit_Btn | Default,
  655.                                    x + 2, y + 2, 8, 1,  NoBorder,Blk);
  656.               Set_DText(CharSetBox,IntlButtArr[12],s[12],System_Font,TE_Left);
  657.                                 {teaser}
  658.               x := 43;  y := 18;
  659.               junk := Add_DItem(CharSetBox,G_String,None,
  660.                                 x,y,10,1,     NoBorder,Blk);
  661.               Set_DText(CharSetBox,junk,'Try French',
  662.                           Small_Font,{prints normal font!}TE_Left);
  663.     
  664.               Center_Dialog(CharSetBox);
  665.               CharPushed := Do_Dialog(CharSetBox,0);
  666.               WHILE CharPushed <> IntlButtArr[12] DO
  667.                 BEGIN
  668.                   CASE CharPushed = IntlButtArr[16] {test print} OF
  669.                     TRUE  :  PrintLanguageSample;
  670.                     FALSE :  SelectNewButton(CharPushed);
  671.                   END {case};
  672.                   {Wait for another push.}
  673.                   CharPushed := Redo_Dialog(CharSetBox,0);
  674.                 END;
  675.               End_Dialog(CharSetBox);
  676.               ConvertChoiceToEpsonCode;
  677.             END {displaycharactersets};
  678.     
  679.           BEGIN {showinternationalmenu}
  680.             {Get rid (temporarily) of the main menu.}
  681.             End_Dialog(Box);
  682.             {Display the character set menu.}
  683.             DisplayCharacterSets;
  684.             Obj_SetState(Box,ButtonArr[36],Normal,FALSE);
  685.             BoxRedrawNeeded := TRUE;
  686.           END {showinternationalmenu};
  687.   
  688.         PROCEDURE ShowExotica;
  689.           CONST
  690.             w = 40;
  691.             h = 23;
  692.   
  693.           PROCEDURE DisplayExotica;
  694.             VAR
  695.               i : integer;
  696.               S : ARRAY[1..20] OF string[30];
  697.               x,y, Nbr,LastCh : integer;
  698.   
  699.             BEGIN
  700.               ExoticaBox := New_Dialog(20,    0,0,w,h);
  701.               FOR i := 1 TO 20 DO
  702.                 ExoticButtonArr[i] := 0;
  703.               s[1] := 'Set Right Margin';    { [20] is editable number}
  704.               s[2] := 'Unidirectional Mode';
  705.               s[3] := 'Graphics Char. Set';
  706.               s[4] := 'Half-speed Mode';
  707.               s[5] := 'Last char in FN';      {[19] is editable char}
  708.   
  709.               s[7]  := 'About This Program';
  710.   
  711.               s[10] := 'Cut-sheet Feeder';
  712.               s[11] := 'OFF';
  713.               s[12] := 'ON';
  714.               s[13] := 'Return';
  715.   
  716.               s[14] := 'The Graphics character set';
  717.               s[15] := 'Redefines CHR(128) - CHR(159)';
  718.   
  719.               x := 9; y := 1;
  720.               FOR i := 1 TO 5 DO
  721.                 ExoticButtonArr[i] := MakeButton(ExoticaBox,x,Y + i, 21,
  722.                                              s[i],FALSE);
  723.               Nbr := Add_DItem(ExoticaBox,G_FText,Editable,
  724.                                       x + 22,  y + 1 ,3, 1,   NoBorder,Blk);
  725.               Set_DEdit(ExoticaBox,Nbr,
  726.                          '___','999','___',
  727.                          System_Font,TE_Left);
  728.               ExoticButtonArr[20] := Nbr;
  729.               LastCh := Add_DItem(ExoticaBox,
  730.                                      G_FText,Editable,
  731.                                      x + 22   ,y + 5,1,1,     NoBorder,Blk);
  732.               Set_DEdit(ExoticaBox,LastCh,
  733.                           '_','a','A',
  734.                           System_Font,TE_Left);
  735.               ExoticButtonArr[19] := LastCh;
  736.                                   {about this program}
  737.               x := 9;  y := 7;
  738.               FOR i := 7 TO 7 DO
  739.                 ExoticButtonArr[i] := MakeButton(ExoticaBox,x,  y + i - 5,
  740.                                  21,   s[i],TRUE);
  741.                                   {cut-sheet feeder}
  742.               x := 12;  y := 11;
  743.               MakeText(ExoticaBox,x,y,18,    s[10]);
  744.               ExoticButtonArr[11] := MakeButton(ExoticaBox,x,        y + 1,  5,
  745.                                               s[11],TRUE);
  746.               ExoticButtonArr[12] := MakeButton(ExoticaBox,x + 7,    y + 1,  5,
  747.                                                  s[12],TRUE);
  748.               Obj_SetState(ExoticaBox,ExoticButtonArr[11],Selected,FALSE);
  749.                                   {return}
  750.               x := 15; y  := 14;
  751.               ExoticButtonArr[13] := Add_DItem(ExoticaBox,G_Button,
  752.                                   Selectable | Exit_btn | Default,
  753.                                   x,y,8,1,    NoBorder,Blk);
  754.               Set_DText(ExoticaBox,ExoticButtonArr[13],s[13],
  755.                           System_Font,TE_Left);
  756.                                   {notes}
  757.               x := 6;  y := 17;
  758.               MakeText(ExoticaBox,x,y,     18,s[14]);
  759.               MakeText(ExoticaBox,x,y + 1, 18,s[15]);
  760.               Center_Dialog(ExoticaBox);
  761.             END {displayexotica};
  762.   
  763.             PROCEDURE ProcessExotica;
  764.               VAR
  765.                 MyNumber : integer;
  766.                 Pushed   : integer;
  767.                 i : integer;
  768.                 Str : string[255];
  769.   
  770.               PROCEDURE DisplayCoverSheet;
  771.                 CONST
  772.                   w = 39;
  773.                   h = 16;
  774.                 VAR
  775.                   s : ARRAY [1..12] OF string[35];
  776.                   Box : dialog_ptr;
  777.                   OK : integer;
  778.   
  779.                 PROCEDURE DrawBox;
  780.                   VAR
  781.                     i, x, y : integer;
  782.                   BEGIN
  783.                   s[1] := 'Penultimate Printer Setter Upper';
  784.                   s[2] := '           Version 1.0';
  785.                   s[3] := '               by';
  786.                   s[4] := '         Merlin L. Hanson';
  787.                   s[5] := '        Genie : M.L.HANSON';
  788.                   s[6] := '         1832 Noble Road';
  789.                   s[7] := '      Arden Hills, Mn 55112';
  790.                   s[8] := '                            ';
  791.                   s[9] := '  Portions of the product are';
  792.                   s[10] := 'Copyright  1986, OSS and CCD.';
  793.                   INSERT    (CHR(189),s[10],11           );
  794.                   s[11] := '   Used by Permission of OSS.';
  795.                   s[12] :=             ' OK ';
  796.                   Box := New_Dialog(12,    0,0,w,h);
  797.                   x := 3;  y := 1;
  798.                   FOR i := 1 TO 11 DO
  799.                     MakeText(Box,x,y + i, 34,    s[i]);
  800.                   x := 17; y := 14;
  801.                   OK := Add_DItem(Box,G_Button,
  802.                             Selectable | Exit_Btn | Default,
  803.                             x,y,4,1,     NoBorder,Blk);
  804.                   Set_DText(Box,OK,s[12],System_Font,TE_Left);
  805.                   END {drawbox};
  806.   
  807.                 BEGIN  {displaycoversheet}
  808.                   End_Dialog(ExoticaBox);
  809.                   DrawBox;
  810.                   Center_Dialog(Box);
  811.                   OK := Do_Dialog(Box,0);
  812.                   End_Dialog(Box);
  813.                 END {displaycoversheet};
  814.   
  815.               PROCEDURE ToggleCutSheet(Nbr1,Nbr2: integer);
  816.               {Select Nbr1, de-select Nbr2}
  817.                 BEGIN
  818.                   Obj_SetState(ExoticaBox,ExoticButtonArr[Nbr2],Normal,TRUE);
  819.                   Obj_SetState(ExoticaBox,ExoticButtonArr[Nbr1],Selected,TRUE);
  820.                 END {toglecutsheet};
  821.   
  822.               BEGIN {processexotica}
  823.                 Pushed := Do_Dialog(ExoticaBox,ExoticButtonArr[19]);
  824.                 WHILE Pushed <> ExoticButtonArr[13] DO
  825.                   BEGIN
  826.                     {Convert from GEM to my number}
  827.                     FOR i := 1 TO 20 DO
  828.                       IF ExoticButtonArr[i] = Pushed THEN
  829.                         MyNumber := i;
  830.                     (*WriteLn('my number:',mynumber);*)
  831.                     CASE MyNumber OF
  832.                       6  : WriteLn('print CC was called.');
  833.                       7  : BEGIN
  834.                              DisplayCoversheet;
  835.                              Obj_SetState(ExoticaBox,ExoticButtonArr[7],
  836.                                           Normal,FALSE);
  837.                            END;
  838.                       11 : ToggleCutSheet(11,12);
  839.                       12 : ToggleCutSheet(12,11);
  840.                     END {case};
  841.                     CASE MyNumber OF
  842.                       7         : Pushed := Do_Dialog  (ExoticaBox,0);
  843.                       OTHERWISE : Pushed := Redo_Dialog(ExoticaBox,0);
  844.                     END {case};
  845.                   END {while};
  846.                 Get_DEdit(ExoticaBox,ExoticButtonArr[19],Str);
  847.                 (*WriteLn('str:',ORD(str[1]));*)
  848.                 IF Str[1] In ['a'..'z', 'A'..'Z'] THEN
  849.                   CmdFileName[11] := Str[1];
  850.                 (*Writeln('new file name:',cmdfilename);*)
  851.                 {De-select the exit button.}
  852.                 Obj_SetState(ExoticaBox,ExoticButtonArr[13],
  853.                                   Normal,TRUE);
  854.               END {processexotica};
  855.   
  856.           PROCEDURE FillExoticaCC;
  857.             VAR
  858.               i : integer;
  859.               CC : PACKED ARRAY[1..30] OF char;
  860.               Str : string[255];
  861.               Nbr : integer;
  862.   
  863.             FUNCTION TestButton
  864.                           (Nbr : integer)
  865.                                : boolean;
  866.               BEGIN
  867.                 IF Obj_State(ExoticaBox,ExoticButtonArr[Nbr])
  868.                 & Selected <> 0
  869.                   THEN TestButton := TRUE
  870.                   ELSE TestButton := FALSE;
  871.               END {testbutton};
  872.   
  873.             BEGIN  {fillexoticaCC}
  874.               i := 1;
  875.                     {right margin}
  876.               IF TestButton(1)
  877.                 THEN
  878.                   BEGIN
  879.                     Get_DEdit(ExoticaBox,ExoticButtonArr[20],Str);
  880.                     StringToInteger(Str,Nbr,3);
  881.                     CC[i] := CHR(ESC);
  882.                     CC[i + 1] := 'Q';
  883.                     CC[i + 2] := CHR(Nbr);
  884.                     i := i + 3;
  885.                   END;
  886.                      {unidirectional mode}
  887.               IF TestButton(2)  THEN
  888.                 BEGIN
  889.                   CC[i] := CHR(ESC);
  890.                   CC[i + 1] := 'U';
  891.                   CC[i + 2] := CHR(1);
  892.                   i := i + 3;
  893.                 END;
  894.                      {graphics character set}
  895.               IF TestButton(3) THEN
  896.                 BEGIN
  897.                   CC[i] := CHR(ESC);
  898.                   CC[i + 1] := 'm';
  899.                   CC[i + 2] := CHR(4);
  900.                   i := i + 3;
  901.                 END;
  902.                     {half-speed mode}
  903.               IF TestButton(4) THEN
  904.                 BEGIN
  905.                   CC[i] := CHR(ESC);
  906.                   CC[i + 1] := 's';
  907.                   CC[i + 2] := CHR(1);
  908.                   i := i + 3;
  909.                 END;
  910.                     {cut-sheet feeder}
  911.               IF TestButton(12) THEN
  912.                 BEGIN
  913.                   CC[i] := CHR(ESC);
  914.                   CC[i + 1] := CHR(25);
  915.                   CC[i + 2] := CHR(4);
  916.                   i := i + 3;
  917.                 END;
  918.               IF i > 1 THEN
  919.                 NbrCharOfExotica := i - 1;
  920.               {Now put data in global array}
  921.               ExoticaCC := CC;
  922.             END {fillexoticaCC};
  923.   
  924.           BEGIN {showexotica}
  925.             IF NOT ExoticaDrawn THEN
  926.               BEGIN
  927.                 DisplayExotica;
  928.                 ExoticaDrawn := TRUE;
  929.               END;
  930.             ProcessExotica;
  931.             FillExoticaCC;
  932.             FormPrinterCommands;
  933.             (*PrintCommandCodes;*)
  934.             End_Dialog(ExoticaBox);
  935.           END {showexotica};
  936.   
  937.         PROCEDURE HelpMenu;
  938.   
  939.           CONST
  940.             w = 60;
  941.             h = 20;
  942.           VAR
  943.             HelpBox : dialog_ptr;
  944.             s  : ARRAY [1..20] OF string[55];
  945.             i, Pushed, junk : integer;
  946.   
  947.           PROCEDURE HelpNbr2;
  948.             CONST
  949.               w = 60;
  950.               h = 20;
  951.             VAR
  952.               Help2 : dialog_ptr;
  953.               i,junk,pushed : integer;
  954.               s : ARRAY[1..20] OF string[55];
  955.             BEGIN
  956.               s[1] := 'Remember to position the paper (vertically)';
  957.               s[2] := 'before you make your final exit.';
  958.               s[3] := 'Note that the RESET state of skip perforations';
  959.               s[4] := 'is OFF.';
  960.               s[5] := 'The initial displays conform to the RESET state.';
  961.               s[6] := 'Printer switches may override some choices.';
  962.               s[20] := ' RETURN ';
  963.               Help2 := New_Dialog(20,    0,0,w,h);
  964.               FOR i := 1 TO 6 DO
  965.                 MakeText(Help2,5,i,   52,s[i]);
  966.               junk := Add_DItem(Help2,G_Button,
  967.                        Selectable | Exit_Btn | Default,
  968.                        26,18,8,1,    NoBorder,Blk);
  969.               Set_DText(Help2,junk,s[20],System_Font,TE_Left);
  970.               Center_Dialog(Help2);
  971.               Pushed := Do_Dialog(Help2,0);
  972.               End_Dialog(Help2);
  973.             END {helpnbr2};
  974.   
  975.           BEGIN {helpmenu}
  976.             s[1] := 'The margins are specified in number of characters.   ';
  977.             s[2] := 'The right margin is specified from the *left* side.  ';
  978.             s[3] := ' PITCHES in characters per inch.                     ';
  979.             s[4] := '     NLQ              10.0                           ';
  980.             s[5] := '     Pica             10.0                           ';
  981.             s[6] := '     Elite            12.0                           ';
  982.             s[7] := '     Compressed       17.16                          ';
  983.             s[8] := '     Compressed Elite 20.0                           ';
  984.             s[9] := 'You can not CANCEL after printing a test line.       ';
  985.             s[10] := 'Some of the interactions between choices are not    ';
  986.             s[11] := 'shown.  In particular, NLQ overrides several        ';
  987.             s[12] := 'choices on print style.                             ';
  988.             s[13] := 'Be sure the printer is on and ready to print.      ';
  989.             s[14] := 'When using the editable numeric fields, provide a  ';
  990.             s[15] := 'digit in all positions, using leading zeroes       ';
  991.             s[16] := 'if needed.                                         ';
  992.             s[20] := ' MORE ';
  993.             HelpBox := New_Dialog(20,    0,0,w,h);
  994.             FOR i := 1 TO 16 DO
  995.               MakeText(HelpBox, 5, i,   52,s[i]);
  996.             junk := Add_DItem(HelpBox,G_Button,Selectable | Default |Exit_Btn,
  997.                         26,18,6,1,   NoBorder,Blk);
  998.             Set_DText(HelpBox,junk,s[20],System_Font,TE_Left);
  999.             Center_Dialog(HelpBox);
  1000.             Pushed := Do_Dialog(HelpBox,0);
  1001.             End_Dialog(HelpBox);
  1002.             HelpNbr2;
  1003.           END {helpmenu};
  1004.   
  1005.         PROCEDURE TestPrint;
  1006.           BEGIN
  1007.             FormPrinterCommands;
  1008.             SendCommandsToPrinter;
  1009.             PrintTwoLines;
  1010.             ButtonSelected[32] := FALSE;
  1011.             Obj_SetState(Box,ButtonArr[32],Normal,TRUE);
  1012.             Obj_SetState(Box,ButtonArr[34],Disabled,TRUE);
  1013.           END {testprint};
  1014.     
  1015.         PROCEDURE FormFeed;
  1016.           CONST
  1017.             FF = 12;    {ASCII}
  1018.           BEGIN
  1019.             FormPrinterCommands;
  1020.             SendCommandsToPrinter;
  1021.             WriteLn(CHR(FF));
  1022.             ButtonSelected[33] := FALSE;
  1023.             Obj_SetState(Box,ButtonArr[33],Normal,TRUE);
  1024.             Obj_SetState(Box,ButtonArr[34],Disabled,TRUE);
  1025.           END {formfeed};
  1026.     
  1027.         PROCEDURE SaveFile;
  1028.           BEGIN
  1029.             FormPrinterCommnds;
  1030.             SndCommandsToFile;
  1031.             ButtonSelected[39] := FALSE;
  1032.             Obj_SetState(Box,ButtonArr[39],Normal,TRUE);
  1033.           END {savefile};
  1034.     
  1035.           BEGIN {processbuttonpush}
  1036.               CASE MyNumber OF
  1037.                 15,16,17    : ChangeMutuallyExclusive(MyNumber,15,17,Box);
  1038.                 19,20,21,22 : ChangeMutuallyExclusive(MyNumber,19,22,Box);
  1039.                 23,24       : ChangeMutuallyExclusive(MyNumber,23,24,Box);
  1040.                 37,38       : ChangeMutuallyExclusive(MyNumber,37,38,Box);
  1041.                 32          : TestPrint;
  1042.                 33          : FormFeed;
  1043.                 36          : ShowInternationalMenu;
  1044.                 39          : SaveFile;
  1045.                 41          : BEGIN        {exotica}
  1046.                                 End_Dialog(Box);
  1047.                                 ShowExotica;
  1048.                                 Obj_SetState(Box,ButtonArr[41],Normal,FALSE);
  1049.                                 BoxRedrawNeeded := TRUE;
  1050.                               END;
  1051.                 42          : BEGIN          {help}
  1052.                                 End_Dialog(Box);
  1053.                                 HelpMenu;
  1054.                                 Obj_SetState(Box,ButtonArr[42],Normal,FALSE);
  1055.                                 BoxRedrawNeeded := TRUE;
  1056.                               END;
  1057.                 2,3,4,5,   {pitch}
  1058.                 7,8,       {boldness}
  1059.                 12,13,     {effects}
  1060.                 10,        {NLQ}
  1061.                 29         {skip perforations}
  1062.                          :  BEGIN  {do nothing}  END;
  1063.               END {case};
  1064.           END {processbuttonpush};
  1065.     
  1066.         PROCEDURE ProcessAllNumericFields;
  1067.           VAR
  1068.             Str : string[255];
  1069.               i : integer;
  1070.           BEGIN
  1071.             FOR i := 50 TO 54 Do
  1072.               BEGIN
  1073.                 Get_DEdit(Box,ButtonArr[i],Str);
  1074.                 StringToInteger(Str,EditNumber[i],2);
  1075.               END;
  1076.             Get_DEdit(Box,ButtonArr[55]  {n/216 spacing},Str);
  1077.             StringToInteger(Str,EditNumber[55],3);
  1078.             EditNumber[53] := 0;
  1079.             (*For i := 50 to 55 Do
  1080.               writeln(i,':',editnumber[i]);*)
  1081.           END {processallnumericfields};
  1082.     
  1083.         FUNCTION Done : boolean;
  1084.           BEGIN
  1085.             Done := FALSE;
  1086.             {return}
  1087.             IF Pushed = ButtonArr[35] THEN
  1088.               Done := TRUE;
  1089.             {cancel}
  1090.             IF (Pushed = ButtonArr[34]) AND
  1091.             (Obj_State(Box,ButtonArr[34]) & Disabled = 0)
  1092.               THEN
  1093.                 Done := TRUE;
  1094.           END {done};
  1095.     
  1096.       BEGIN  {displayoptions}
  1097.         FillStringsWithText;
  1098.         Box := New_Dialog(50,  0,0,w,h);
  1099.                                   {title}
  1100.         x := 18;  y := 1;
  1101.         MakeText(x, y, 32,title);
  1102.   
  1103.                                   {pitch}
  1104.         x := 5; y := 2;
  1105.         MakeText(x + 3,y,8,s[1]);
  1106.         FOR i := 2 TO 5 DO
  1107.           ButtonArr[i] := MakeButton(x, y + i -1, 11, s[i],FALSE);
  1108.                                   {boldness}
  1109.         x := 4; y := 8;
  1110.         MakeText(x + 2,y,8,s[6]);
  1111.         FOR i := 7 TO 8 DO
  1112.           ButtonArr[i] := MakeButton(x, y + i - 6,   13,s[i],FALSE);
  1113.                                   {effects}
  1114.         x := 5; y := 12;
  1115.         MakeText(x + 1,y,8,s[11]);
  1116.         FOR i := 12 TO 13 DO
  1117.           ButtonArr[i] := MakeButton(x,y + i - 11,10,  s[i],FALSE);
  1118.                                   {script}
  1119.         x := 25; y := 2;
  1120.         MakeText(x,y,7,s[14]);
  1121.         FOR i := 15 TO 17 DO
  1122.           ButtonArr[i] := MakeButton(x,y + i - 14, 6,s[i],TRUE);
  1123.                                   {line spacing}
  1124.         x := 22;  y := 7;
  1125.         MakeText(x,y,7,s[18]);
  1126.         FOR i := 19 TO 22 DO
  1127.           ButtonArr[i] := MakeButton(x + 2,y + i -18, 8,s[i],TRUE);
  1128.         ButtonArr[55] := Add_DItem(Box,G_FText,Editable,
  1129.                                 x + 11, y + 4, 3,1,  NoBorder,Blk);
  1130.         Set_DEdit(Box,ButtonArr[55],
  1131.                      '___','999','___',
  1132.                      System_Font,TE_Left);
  1133.                                   {paper out sensor}
  1134.         x := 21;  y := 13;
  1135.         MakeText(x,y,18,s[38]);
  1136.         FOR i := 23 TO 24 DO
  1137.           ButtonArr[i] := MakeButton(x + 5,y + i - 22, 5,s[i],TRUE);
  1138.                                   {form}
  1139.         x := 40; y := 2;
  1140.         MakeText(x + 2,y ,6,s[25]);
  1141.         ButtonArr[37] := MakeButton     (x    , y + 1, 2, '  ',TRUE);
  1142.         ButtonArr[38] := MakeButton     (x    , y + 2, 2, '  ',TRUE);
  1143.         ButtonArr[50] := GetEditableLine(x + 5, y + 1, 2, '11');
  1144.         ButtonArr[51] := GetEditableLine(x + 5, y + 2, 2, '__');
  1145.         ButtonArr[52] := GetEditableLine(x + 5, y + 3, 2, '_6');
  1146.         MakeText(x + 9, y + 1,8, s[26]);
  1147.         MakeText(x + 9, y + 2,8, s[27]);
  1148.         MakeText(x + 9, y + 3,8, s[28]);
  1149.         ButtonArr[29] := MakeButton(x,y + 5, 19,s[29],FALSE);
  1150.                                   {left margin}
  1151.         x := 44;  y := 9;
  1152.         MakeText(x,y,13,s[30]);
  1153.         ButtonArr[54] := GetEditableLine(x + 5,y + 1, 2,'_0');
  1154.                                   {NLQ}
  1155.         x := 5;   y := 16;
  1156.         ButtonArr[10] := MakeButton(x + 2,y,5,s[10],FALSE);
  1157.   
  1158.                                   {do and return}
  1159.         x := 42; y := 12;
  1160.         MakeText(x + 1, y,15, s[31]);
  1161.         FOR i := 32 TO 33 DO
  1162.           ButtonArr[i] := MakeButton(x,y + i - 31, 16, s[i],TRUE);
  1163.   
  1164.                                   {character set}
  1165.         x := 42;  y := 16;
  1166.         ButtonArr[36] := MakeButton(x, y,     16,s[36],TRUE);
  1167.                                   {exotica}
  1168.         ButtonArr[41] := MakeButton(x, y + 1, 16,s[41],TRUE);
  1169.         InitializeButtons;
  1170.                         { ------ bottom line ----------}
  1171.         x := 6; y := 19;
  1172.                                   {help}
  1173.         ButtonArr[42] := MakeButton(x + 6,y,6,s[42],TRUE);
  1174.                                   {cancel}
  1175.         ButtonArr[34] := MakeButton(x + 14,y,8,s[34],TRUE);
  1176.                                   {do it}
  1177.         ButtonArr[35] := Add_DItem(Box,G_Button,
  1178.                          Selectable | Exit_Btn | Default,
  1179.                          x + 25, y, 7, 1,   NoBorder,Blk);
  1180.         Set_DText(Box,ButtonArr[35],s[35],System_Font,TE_Left);
  1181.                                   {save file}
  1182.         ButtonArr[39] := MakeButton(x + 34,y,11,s[39],TRUE);
  1183.   
  1184.                                   {done with set up}
  1185.         Init_Mouse;   {Get rid of bee.}
  1186.         BoxRedrawNeeded := FALSE;
  1187.         Center_Dialog(Box);
  1188.         Pushed  := Do_Dialog(Box,0);
  1189.   
  1190.         { ----------------------- Edit loop ---------------------- }
  1191.         WHILE NOT Done DO
  1192.           BEGIN
  1193.             ProcessAllNumericfields;
  1194.             FillButtonSelectedArray;
  1195.             ConvertGEMNbrToMyNbr(Pushed,MyNumber);
  1196.             ProcessButtonPush;
  1197.             CASE BoxRedrawNeeded OF
  1198.               TRUE  : BEGIN
  1199.                         BoxRedrawNeeded := FALSE;
  1200.                         Pushed := Do_Dialog(Box,0);
  1201.                       END;
  1202.               FALSE :  Pushed := Redo_Dialog(Box,0);
  1203.             END {case};
  1204.           END {while};
  1205.         End_Dialog(Box);
  1206.   
  1207.         { --------------------- end edit loop ---------------------- }
  1208.         IF Pushed <> ButtonArr[34] {cancel} THEN
  1209.           BEGIN
  1210.             FillButtonSelectedArray;
  1211.             ProcessAllNumericFields;
  1212.             FormPrinterCommands;
  1213.             SendCommandsToPrinter;
  1214.             IF 1 IN DebugSet THEN
  1215.               PrintCommandCodes;
  1216.           END;
  1217.       END {displayoptions};
  1218.   
  1219.     BEGIN {do_main}
  1220.       DebugSet := [];
  1221.       CmdFileName := KCmdFileName;
  1222.       FOR i := 1 TO 70 DO
  1223.         ButtonArr[i] := 0;
  1224.       Rewrite(output,'prn:');
  1225.       NationCode := 0;
  1226.       ExoticaDrawn := FALSE;
  1227.       DisplayOptions;
  1228.     END {do_main};
  1229.  
  1230. BEGIN {main}
  1231.   IF Init_GEM >= 0 THEN
  1232.     BEGIN
  1233.       Do_Main;
  1234.       Exit_GEM;
  1235.     END;
  1236. END.
  1237.